home *** CD-ROM | disk | FTP | other *** search
/ Acorn User: China / Acorn User China CD-ROM (UK) (Disc A) / Acorn User China CD-ROM (UK) (Disc A).bin / HENSA / FILE / BBCTAPE.ARC / !BBCTape_BBCLDisc < prev    next >
Encoding:
Text File  |  1991-02-26  |  7.1 KB  |  289 lines

  1. MODE 7
  2. REM
  3. REM BBC end of !BBCTape application
  4. REM
  5. REM (C) S. Burke, 26/2/91
  6. REM
  7. REM The next few lines define where the buffers are, where the
  8. REM code goes and where the file loads to.
  9. REM
  10. REM This version might work with discs, but I can't test it!
  11. REM It fits in pages B and C with 0 bytes spare!
  12. REM
  13. :
  14. name       = &0B00
  15. name_high  = &0B
  16. name_low   = &00
  17. block      = &0B10
  18. block_high = &0B
  19. block_low  = &10
  20. code_start = &0B30
  21. load_page  = PAGE DIV &100
  22. :
  23. osfind = &FFCE
  24. osbget = &FFD7
  25. osfile = &FFDD  :REM Page 335 of the Advanced User Guide is wrong!
  26. osbyte = &FFF4
  27. :
  28. FOR opt%=0 TO 3 STEP 3
  29. P% = code_start
  30. [OPT opt%
  31. .go
  32.           LDX #0
  33.           LDA #2
  34.           JSR osbyte        \ disable RS423
  35.           LDX #0
  36.           LDA #15
  37.           JSR osbyte        \ flush all buffers
  38.           LDX #2
  39.           TXA
  40.           JSR osbyte        \ enable RS423 receive
  41. .mainloop
  42.           LDA #&0D
  43.           STA name          \ null name
  44.           JSR handshake
  45. :
  46.           JSR get           \ get command
  47.           CPY #&C0
  48.           BEQ end           \ quit
  49. :
  50.           CPY #&30
  51.           BNE load
  52.           JSR put_ok        \ confirm command
  53.           JSR get_name      \ get filename
  54.           JSR handshake
  55.           JSR get
  56. .load
  57.           CPY #&0C
  58.           BNE load_byte
  59.           JSR put_ok        \ confirm command
  60.           JSR load_file
  61.           JSR send_file
  62.           JMP mainloop
  63. .load_byte
  64.           CPY #&03
  65.           BNE command_error
  66.           JSR put_ok        \ confirm command
  67.           JSR load_file
  68.           JSR send_file
  69.           JMP mainloop
  70. .command_error
  71.           LDA #0
  72.           JSR put           \ command error
  73.           JMP mainloop
  74. .end
  75.           RTS
  76. .load_file
  77.           LDA #name_low     \ set up parameter block
  78.           STA block
  79.           LDA #name_high
  80.           STA block+1
  81.           LDA #0
  82.           STA block+2
  83.           STA block+6
  84.           LDA #load_page
  85.           STA block+3
  86.           LDA #&FF
  87.           STA block+4
  88.           STA block+5
  89.           LDX #block_low
  90.           LDY #block_high
  91.           JSR osfile        \ load file
  92.           LDA block+10
  93.           STA &71
  94.           LDA block+11
  95.           STA &72           \ put file length in &71, &72
  96.           JSR read_load_exec\ get load/exec address and name
  97. .read_name
  98.           LDX #&FF
  99. .nameloop
  100.           INX
  101.           CPX #&C
  102.           BEQ too_far
  103. \         LDA &3B2,X        ! pull filename out of cassette workspace
  104.           LDA #0            \ don't know where to get it for a disc system
  105.           STA name,X        \ see AUG p. 279
  106.           BNE nameloop
  107. .too_far
  108.           LDA #&0D
  109.           STA name,X
  110.           RTS
  111. .get_name
  112.           LDX #&FF
  113.           STX &81           \ "get" corrupts registers
  114. .get_char
  115.           CPX #&B
  116.           BEQ too_far
  117.           JSR get           \ get filename from Arc
  118.           TYA
  119.           INC &81   
  120.           LDX &81
  121.           STA name,X
  122.           CMP #&0D
  123.           BNE get_char
  124.           RTS
  125. .read_load_exec
  126.           LDX #8
  127. .load_exec_loop
  128.           LDA &3BD,X        \ load/exec address from cassette workspace
  129.           STA &81,X
  130.           DEX
  131.           BNE load_exec_loop
  132.           RTS
  133. .handshake
  134.           LDA #ASC("S")
  135.           JSR put
  136.           LDA #ASC("B")
  137.           JSR put           \ send "SB" ...
  138.           JSR get
  139.           CPY #ASC("s")
  140.           BNE handshake
  141.           JSR get
  142.           CPY #ASC("b")
  143.           BNE handshake     \ ... and receive "sb" to handshake
  144.           RTS
  145. .send_file
  146.           LDA &71
  147.           JSR put
  148.           LDA &72
  149.           JSR put           \ send file length
  150. :
  151.           LDA #load_page
  152.           STA &74
  153.           LDA #0 
  154.           STA &73           \ reset load address
  155.           DEC &72           \ need this for test below
  156.           BMI last_block    \ file length < 256 bytes?
  157.           STA &80           \ block length = 0 ( = 256)
  158. .send_block
  159.           JSR put_ok        \ not eof
  160.           LDA #3            \ send length 3 times
  161.           STA &76           \ use CRC low byte as counter
  162. .lenout
  163.           LDA &80
  164.           JSR put           \ output block length
  165.           DEC &76
  166.           BNE lenout        \ CRC low byte zero at exit
  167.           LDY #0
  168.           STY &75           \ initialise CRC high byte
  169. .send_byte
  170.           STY &70           \ save offset
  171.           LDA (&73),Y       \ load next byte ...
  172.           PHA
  173.           JSR put
  174.           PLA               \ get character back
  175.           JSR crc           \ update crc
  176.           LDY &70
  177.           INY               \ increment offset
  178.           CPY &80
  179.           BNE send_byte     \ end of block?
  180. :
  181.           LDA &75
  182.           JSR put           \ output CRC high byte
  183.           LDA &76
  184.           JSR put           \ output CRC low byte
  185. :
  186.           JSR get           \ look for confirmation
  187.           TYA
  188.           BEQ send_block    \ zero means error, so do again
  189. :
  190.           INC &74           \ increment address high byte
  191.           DEC &72           \ decrement length high byte
  192.           BPL send_block    \ are we finished?
  193. .last_block
  194.           LDY #0
  195.           LDA &71           \ length of last block
  196.           STY &71           \ set length to zero
  197.           STA &80
  198.           BNE send_block    \ output if non-zero
  199.           LDA #0
  200.           JSR put           \ zero marks eof
  201.           JSR put_load_exec \ send the load/exec adress
  202. .put_name                   \ fall through to put_name ...
  203.           LDX #&FF
  204.           STX &81           \ "put" corrupts registers
  205. .put_char                   \ output file name
  206.           INC &81
  207.           LDX &81
  208.           LDA name,X
  209.           PHA
  210.           JSR put
  211.           PLA
  212.           CMP #&0D
  213.           BNE put_char
  214.           RTS
  215. .put_load_exec              \ put out load/exec address
  216.           LDX #0
  217.           STX &81           \ "put" corrupts registers
  218. .put_load_exec_loop
  219.           LDA &82,X
  220.           JSR put
  221.           INC &81
  222.           LDX &81
  223.           CPX #8
  224.           BNE put_load_exec_loop
  225.           RTS
  226. .put_ok
  227.           LDA #&FF
  228. .put
  229.           PHA               \ save value to output
  230.           JSR escape
  231.           LDX #&FD
  232.           LDA #&80
  233.           JSR osbyte        \ get # empty bytes in RS423 output buffer
  234.           CPX #9
  235.           PLA
  236.           BCC put           \ if < 9 bytes remain, wait ...
  237. :
  238.           LDX #2
  239.           TAY
  240.           LDA #&8A
  241.           JMP osbyte        \ ... and send it
  242. .get
  243.           JSR escape
  244.           LDX #1
  245.           LDA #&91
  246.           JSR osbyte        \ read a byte
  247.           BCS get
  248.           RTS
  249. .crc
  250.           EOR &75           \ calculate CRC in &75, &76
  251.           STA &75           \ algorithm from Advanced User Guide
  252.           LDX #8            \ I hope it's right!
  253. .crc_loop
  254.           LDA &75
  255.           ROL A
  256.           BCC b7z
  257.           LDA &75
  258.           EOR #8
  259.           STA &75
  260.           LDA &76
  261.           EOR #&10
  262.           STA &76
  263. .b7z
  264.           ROL &76
  265.           ROL &75
  266.           DEX
  267.           BNE crc_loop
  268.           RTS
  269. .escape
  270.           LDA &FF
  271.           BMI error
  272.           RTS
  273. .error
  274.           LDA #&7E
  275.           JSR osbyte        \ acknowledge escape
  276.           LDX #0
  277.           LDY #0
  278.           LDA #0
  279.           JSR &FFCE         \ close all files
  280.           BRK
  281. ]
  282. ?P% = &11
  283. P%  = P% + 1
  284. $P% = "Escape" + CHR$0
  285. NEXT opt%
  286. *OPT 1,2
  287. RUN
  288. CALL go
  289.